package aceim.app.widgets; import android.content.Context; import android.database.DataSetObserver; import android.graphics.Rect; import android.os.Handler; import android.util.AttributeSet; import android.view.View; import android.widget.ArrayAdapter; import android.widget.HorizontalScrollView; import android.widget.LinearLayout; public class HorizontalListView extends HorizontalScrollView { private final Handler mHandler = new Handler(); private LinearLayout mLayout; private ArrayAdapter<?> mAdapter; private final DataSetObserver mObserver = new DataSetObserver() { @Override public void onChanged() { for (int i = 0; i < mAdapter.getCount(); i++) { View view; if ((mLayout.getChildCount() - 1) < i) { view = null; } else { view = mLayout.getChildAt(i); } View newView = mAdapter.getView(i, view, mLayout); if (view == null) { mLayout.addView(newView); } else if (view != newView) { mLayout.removeViewAt(i); mLayout.addView(newView, i); } } if (mLayout.getChildCount() > mAdapter.getCount()) { for (int i = mAdapter.getCount(); i < mLayout.getChildCount(); i++) { mLayout.removeViewAt(i); } } } @Override public void onInvalidated() { mLayout.removeAllViews(); for (int i = 0; i < mAdapter.getCount(); i++) { mLayout.addView(mAdapter.getView(i, null, mLayout)); } } }; public HorizontalListView(Context context) { super(context); init(context); } public HorizontalListView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public HorizontalListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context); } private void init(Context context) { mLayout = new LinearLayout(context); mLayout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT)); addView(mLayout); } public void setAdapter(ArrayAdapter<?> adapter) { this.mAdapter = adapter; this.mAdapter.registerDataSetObserver(mObserver); } public ArrayAdapter<?> getAdapter() { return mAdapter; } public void setSelected(Object tag) { if (tag == null) { return; } for (int i = 0; i < mLayout.getChildCount(); i++) { final View view = mLayout.getChildAt(i); view.setSelected(view.getTag() == tag); if (view.getTag() == tag) { mHandler.post(new Runnable() { @Override public void run() { scrollTo(view); } }); } } } private void scrollTo(View child) { Rect rect = new Rect(); getDrawingRect(rect); int leftBound = child.getLeft(); int rightBound = child.getRight(); if (rect.left > leftBound) { smoothScrollTo(leftBound, 0); return; } if (rect.right < rightBound) { smoothScrollTo(rightBound, 0); return; } } }